Test Double
テストのための代用品
前提として以下の2つを抑える
「SUTが依存する関数」の引数
「SUTが依存する関数」の返り値
大きく分けると2つ、小さく分けると5つある
SUTから外部へ向かうコミュニケーションを模倣し、検証するために使う
Post, Commandの方向mrsekut.icon
間接出力を受け取って、その検証も行う
SUTの間接出力を記録する
SUTに対して、内部へ向かうコミュニケーションを模倣するのに使われる
Get, Queryの方向mrsekut.icon
SUTへの間接入力を代替する
テストに影響を与えない代替object
テストの範囲内で本物と同じように動作する
まだ存在しない依存を置き換える
分類は諸説ある
割と一般的になっているっぽい
test libraryが上記の分類に沿っていると理解が楽になる
Jestは沿っていないので困惑するとのこと ref 以下の2つを混同しないようにする
道具としての「モック」
濫用される「モック」という言葉
libraryの命名などで雑に呼んでる「モック」のこと
test stubもmock objectも作れる
test doubleとしてのmock
mock object
参考
簡潔でわかりやすい
よく引用されている記事
test doubleのメンテは大変
↓こういう感じか?
こういう関数をテストしたいときに
code:ts
const sut = () => {
.. // ①
const r = ex(x)
.. // ②
}
ex()が外部の関数である
良い感じの返り値を返してくれるex()をtest stubと呼ぶ
ex()の返り値(間接入力)を代替している
ここで検証したいのは、rの値を固定した上でのその他の処理
雑に捉えるなら②の部分の処理
Mock Object内にテストコードを書いてる感じ?
ここで検証したいのは、xの作り方部分
雑に捉えるなら①の部分の処理
これだけ見ると、①の部分を別の関数に切り出せばMock Objectという概念が不要にならん?
両方の性質を持ったtest doubleもある
そういう場合は「モック」と呼ばれる事が多い
雑すぎん?
両方とも間接出力を検証する
Mock Objectは、Mock Object内で間接出力結果を評価する
Test Spyは間接出力を保持するだけで、間接出力結果の評価は後からテストコード上で行う
Mock Objectの立ち位置かなり異様じゃない?
もはや並列概念ですら無い気もする
多くの場合、両方の性質を持ったものを使うことが多くない?mrsekut.icon